package com.ceuer.pet;

import com.ceuer.pet.dao.PetDao;
import com.ceuer.pet.dao.UserDao;
import com.ceuer.pet.dao.impl.PetDaoImpl;
import com.ceuer.pet.dao.impl.UserDaoImpl;
import com.ceuer.pet.entity.Pet;
import com.ceuer.pet.entity.User;
import com.ceuer.pet.util.DateUtil;

import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Main {
	static PetDao petDao = new PetDaoImpl();
	static UserDao userDao = new UserDaoImpl();
	//判断用户是否登录
	static User isLogin = null;//isLogin表示一个登录用户的信息，如果没有登录那个是null 登录成功之后，online是有完整的用户信息的
	
	public static void main(String[] args) {
		while (true) {//死循环
			welcome();
		}
	}
	
	/**
	 * 返回首页的功能+操作项
	 */
	private static void welcome() {
		System.out.println("********************************》》》欢迎光临xxx宠物店！《《《********************************");
		try {
			List<Pet> petList = petDao.selectIndexAll();
			if(petList==null || petList.size()==0){
				System.out.println("当前宠物店宠物已经全部被领养，请您等待管理员录入新的宠物~~~");
			}
			for (int i = 0; i < petList.size(); i++) {
				//1.旺财(类型：宠物狗，血统：哈士奇，年龄：1岁，性别：雄性)
				Pet pet = petList.get(i);
				String item = "序号" + (i + 1) + " " + pet.getNickname() + "\t\t类型：" + pet.getBreed().getSpecies().getName() + "\t\t血统：" + pet.getBreed().getName() + "\t\t年龄：" + pet.getAge() + "岁\t\t性别：" + pet.getSexName();
				System.out.println(item);
			}
			/*
				返回首页的操作项
				   1. 没有登录---> 请选择操作项(1.查看宠物列表 2.登录 3.注册)
				   2. 已经登录---> 请选择操作项(1.查看宠物列表 2.查看我的宠物 3.退出登录 4.修改密码 5.注销账户)
			 */
			Scanner input = new Scanner(System.in);
			int num = 0;//定义操作选项
			if (isLogin == null) {//没有登录
				if(petList!=null && petList.size()>0){
					System.out.print("请选择操作项(1.选择列表序号查看宠物详情 2.登录 3.注册)>");
					num = input.nextInt();//程序就暂停在这里
					if (num < 1 || num > 3) {
						throw new InputMismatchException();
					}
					if (num == 1) {//显示宠物详情
						System.out.print("请输入宠物序号>");
						int index = input.nextInt();
						showPetInfo(petList.get(index - 1));
					}else if (num == 2) {//选择了登录业务
						login();
					} else if (num == 3) {//选择了注册业务
						reg();
					}
				}else{
					System.out.print("请选择操作项(1.登录 2.注册)>");
					num = input.nextInt();//程序就暂停在这里
					if (num < 1 || num > 2) {
						throw new InputMismatchException();
					}
					if (num == 1) {//选择了登录业务
						login();
					} else if (num == 2) {//选择了注册业务
						reg();
					}
				}
			} else {//登录了
				if(petList!=null && petList.size()>0){
					System.out.print("请选择操作项(1.选择列表序号查看宠物详情 2.查看我的宠物 3.退出登录 4.修改密码 5.注销账户)>");
					num = input.nextInt();//程序就暂停在这里
					if (num < 1 || num > 5) {
						throw new InputMismatchException();
					}
					if (num == 1) {//显示宠物详情
						System.out.print("请输入宠物序号>");
						int index = input.nextInt();
						showPetInfo(petList.get(index - 1));
					}else if (num == 2) {//查看我的宠物
						myPet();
					} else if (num == 3) {//退出登录
						System.out.print("您确认要退出系统吗？(1.确认 2.取消)>");
						int exit = input.nextInt();
						if (exit == 1) {
							isLogin = null;//设置isLogin=null即可清空登录信息
						}
					} else if (num == 4) {//修改密码
						updatePassword();
					} else if (num == 5) {//注销账户
						logoff();
					}
				}else {
					System.out.print("请选择操作项(1.查看我的宠物 2.退出登录 3.修改密码 4.注销账户)>");
					num = input.nextInt();//程序就暂停在这里
					if (num < 1 || num > 4) {
						throw new InputMismatchException();
					}
					if (num == 1) {//查看我的宠物
						myPet();
					} else if (num == 2) {//退出登录
						System.out.print("您确认要退出系统吗？(1.确认 2.取消)>");
						int exit = input.nextInt();
						if (exit == 1) {
							isLogin = null;//设置isLogin=null即可清空登录信息
						}
					} else if (num == 3) {//修改密码
						updatePassword();
					} else if (num == 4) {//注销账户
						logoff();
					}
				}
			}
		} catch (InputMismatchException e) {
			System.err.println("[首页模块]:非法输入，请输入操作序号");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 显示宠物详情
	 * @param pet 宠物对象
	 */
	private static void showPetInfo(Pet pet) {
		System.out.println("********************************》》》显示宠物详情《《《********************************");
		try {
			if (pet != null) {
				System.out.println("编号:" + pet.getId());
				System.out.println("类型:" + pet.getBreed().getSpecies().getName());
				System.out.println("血统:" + pet.getBreed().getName());
				System.out.println("昵称:" + pet.getNickname());
				System.out.println("年龄:" + pet.getAge() + "岁");
				System.out.println("性别:" + pet.getSexName());
				if (pet.getRemrk() != null) {
					System.out.println("备注:" + pet.getRemrk());
				}
				
				/*
					1. 没有登录---> 请选择操作项(1.返回首页)
					2. 已经登录---> 请选择操作项(1.领养宠物 2.返回首页)
				 */
				Scanner input = new Scanner(System.in);
				if(isLogin==null){//没有登录
					System.out.print("请选择操作项(1.返回首页)>");
					int num = input.nextInt();//程序就暂停在这里
					if (num != 1) {
						throw new InputMismatchException();
					}
					welcome();
				}else{//已经登录
					if(pet.getOwner()!=null){//当前宠物已经被领养
						System.out.print("请选择操作项(1.返回首页)>");
						int num = input.nextInt();//程序就暂停在这里
						if (num!=1) {
							throw new InputMismatchException();
						}
						welcome();
					}else{
						System.out.print("请选择操作项(1.返回首页 2.领养宠物)>");
						int num = input.nextInt();//程序就暂停在这里
						if (num < 1 || num>2) {
							throw new InputMismatchException();
						}
						if(num==1){
							welcome();
						}else{
							adopt(pet);
						}
					}
				}
			} else {
				System.err.println("获取宠物信息失败！");
			}
		} catch (InputMismatchException e) {
			System.err.println("[显示宠物详情模块]:非法输入，请输入操作序号");
			showPetInfo(pet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static void login() {
		System.out.println("********************************》》》登录界面《《《********************************");
		try {
			Scanner input = new Scanner(System.in);
			System.out.print("请输入手机账号：");
			String mobile = input.next();
			System.out.print("请输入账号密码：");
			String password = input.next();
			
			if (mobile == null || mobile.trim().length() == 0) {
				System.err.println("请您输入手机号");
				welcome();
				return;
			}
			if (password == null || password.trim().length() == 0) {
				System.err.println("请您输入密码");
				welcome();
				return;
			}
			
			User check = userDao.selectByMobile(mobile);
			if (check == null || check.getStatus() == 2) {//=2是注销状态 提示账号不存在
				System.err.println("您输入的手机号不存在，请更换或者重新登录!\r\n");
				welcome();
				return;
			} else if (check.getEnable() == 2) {
				System.err.println("您输入的账号已被禁用，请联系管理员！");
				welcome();
				return;
			}
			
			User online = userDao.login(mobile, password);
			if (online == null) {
				System.err.println("您输入的密码不正确，请重新输入！");
			} else {
				User temp=new User();
				temp.setLogintime(DateUtil.now());
				temp.setId(online.getId());
				boolean re=userDao.update(temp);
				if(re){
					isLogin = online;//登录了，并且记录登录状态和信息
				}
			}
			welcome();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static void reg() {
		System.out.println("********************************》》》注册界面《《《********************************");
		try {
			Scanner input = new Scanner(System.in);
			System.out.print("请输入手机账号：");
			String mobile = input.next();
			System.out.print("请输入账号密码：");
			String password = input.next();
			System.out.print("请输入重复密码：");
			String password2 = input.next();
			System.out.print("请输入账户昵称：");
			String name = input.next();
			
			if (mobile == null || mobile.trim().length() == 0) {
				System.err.println("请您输入手机号");
				return;
			}
			if (password == null || password.trim().length() == 0) {
				System.err.println("请您输入密码");
				return;
			}
			if (!password.equals(password2)) {
				System.err.println("重复密码错误");
				return;
			}
			if (name == null || name.trim().length() == 0) {
				System.err.println("请输入账户昵称");
				return;
			}
			
			//注册
			User check = userDao.selectByMobile(mobile);
			if (check != null && check.getStatus() == 1) {//15802908989 status=1
				System.err.println("您输入的手机号已被注册，请更换或者登录!\r\n");
				return;
			}
			
			User user = new User();
			user.setStatus((check != null && check.getStatus() != null && check.getStatus() == 2) ? 2 : null);
			user.setMobile(mobile);
			user.setPassword(password);
			user.setName(name);
			boolean reg = userDao.reg(user);
			if (!reg) {
				System.err.println("注册失败！由于服务器访问量较大，请稍后再试！");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			welcome();
		}
	}
	
	/**
	 * 修改密码
	 */
	private static void updatePassword() {
		System.out.println("********************************》》》修改密码界面《《《********************************");
		try {
			//part1 输入框部分
			Scanner input = new Scanner(System.in);
			System.out.print("请输入旧密码：");
			String old = input.next();
			System.out.print("请输入新密码：");
			String password = input.next();
			System.out.print("输入重复密码：");
			String password2 = input.next();
			
			//part2 验证部分
			if (password == null || password.trim().length() == 0) {
				System.err.println("请输入新密码");
				welcome();
				return;
			}
			if (!password.equals(password2)) {
				System.err.println("重复密码错误");
				welcome();
				return;
			}
			
			User online=userDao.selectByMobile(isLogin.getMobile());
			if(online==null || !online.getPassword().equals(old)){
				System.err.println("旧密码输入错误");
				welcome();
				return;
			}
			
			//part3 数据库-业务操作部分
			boolean re= userDao.updatePassword(isLogin.getId(), password);
			//part4 数据库操作结果判断部分
			if(re){
				System.out.println("密码修改成功！");
				isLogin = null;//设置isLogin=null即可清空登录信息
			}else{
				System.err.println("修改密码失败，请重试!\r\n");
			}
			welcome();
		} catch (Exception e) {
			e.printStackTrace();
			welcome();
		}
	}
	
	/**
	 * 注销账户
	 */
	private static void logoff(){
		Scanner input=new Scanner(System.in);
		System.out.print("您确认要注销当前账户吗？(1.确认 2.取消)>");
		try {
			int num=input.nextInt();
			if(num<1 || num>2){
				throw new Exception("请您输入正确的操作序号！");
			}
			if(num==1){
				boolean re=userDao.logoff(isLogin.getId());
				if(re){
					isLogin=null;//清除登录标志
					System.out.println("注销账号成功!");
				}else{
					System.err.println("操作失败，请重试!");
				}
			}
		}catch (Exception e){
			System.err.println(e.getMessage());
			//e.printStackTrace();
		}finally {
			welcome();
		}
	}
	
	/**
	 * 领养宠物
	 */
	private static void adopt(Pet pet){
		System.out.println("********************************》》》领养宠物界面《《《********************************");
		try {
			Scanner input=new Scanner(System.in);
			System.out.print("您确认要领养["+pet.getNickname()+"("+pet.getBreed().getName()+")"+"]吗？(1.确认 2.取消)>");
			int num=input.nextInt();
			if(num<1 || num>2){//输入错误的时候
				throw new Exception("您输入的操作项错误，请输入1或者2!");
			}
			if(num==1){//确认---领养 查看我的宠物
				//part1 操作领养时，一定要实时查一次当前宠物的最新数据，防止重复领养
				boolean re=petDao.selectPetByOwner(pet.getId(),isLogin.getId());
				if(re){//被领养了
					System.err.println("当前宠物已经被领养，请选择其它宠物！");
					welcome();//返回首页----重新查询没有被领养的宠物列表
				}else{
					//part2 修改宠物表，更改宠物的领养人和时间
					re= petDao.adopt(pet.getId(),isLogin.getId());
					if(re){//领养成功
						myPet();//调转到我的宠物列表
					}else{
						throw new Exception("领养宠物失败！请稍后再试");
					}
				}
			}else{//取消
				showPetInfo(pet);
			}
		}catch (InputMismatchException e){
			System.err.println("您输入的操作项错误，请输入对应的序号!");
			showPetInfo(pet);
		}catch (Exception e){
			System.err.println(e.getMessage());
			showPetInfo(pet);
		}
	}
	
	/**
	 * 我的宠物列表
	 */
	private static void myPet(){
		System.out.println("********************************》》》"+isLogin.getName()+"的宠物列表！《《《********************************");
		try {
			List<Pet> petList = petDao.selectOwnerAll(isLogin.getId());
			if(petList==null || petList.size()==0){
				System.out.println("您的宠物列表暂时为空！请返回首页选择您喜欢的宠物领养！");
				
				Scanner input = new Scanner(System.in);
				int num = 0;//定义操作选项
				System.out.print("请选择操作项(1.返回首页)>");
				num = input.nextInt();//程序就暂停在这里
				if (num!=1) {
					throw new InputMismatchException();
				}
				welcome();
			}else{
				for (int i = 0; i < petList.size(); i++) {
					//1.旺财(类型：宠物狗，血统：哈士奇，年龄：1岁，性别：雄性)
					Pet pet = petList.get(i);
					String item = "序号" + (i + 1) + " " + pet.getNickname() + "\t\t类型：" + pet.getBreed().getSpecies().getName() + "\t\t血统：" + pet.getBreed().getName() + "\t\t年龄：" + pet.getAge() + "岁\t\t性别：" + pet.getSexName();
					System.out.println(item);
				}
				
				Scanner input = new Scanner(System.in);
				int num = 0;//定义操作选项
				System.out.print("请选择操作项(1.选择列表序号查看宠物详情 2.返回首页)>");
				num = input.nextInt();//程序就暂停在这里
				if (num < 1 || num > 2) {
					throw new InputMismatchException();
				}
				if (num == 1) {//显示宠物详情
					System.out.print("请输入宠物序号>");
					int index = input.nextInt();
					showPetInfo(petList.get(index - 1));
				}else{
					welcome();
				}
			}
		} catch (InputMismatchException e) {
			System.err.println("[首页模块]:非法输入，请输入操作序号");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
